package net.suplementos.web.action;

import java.util.Date;
import java.util.List;

import net.suplementos.negocio.FinanceiroDelegate;
import net.suplementos.pojo.Despesa;
import net.suplementos.servico.FinanceiroServico;
import net.suplementos.web.LocalConstantes;

import org.apache.struts2.convention.annotation.Action;
import org.apache.struts2.convention.annotation.InterceptorRef;
import org.apache.struts2.convention.annotation.InterceptorRefs;
import org.apache.struts2.convention.annotation.Namespace;
import org.apache.struts2.convention.annotation.Result;

import com.opensymphony.xwork2.ActionSupport;

@Namespace("/manterDespesa")
@InterceptorRefs({ @InterceptorRef(value = "store", params = { "operationMode", "AUTOMATIC" }),
        @InterceptorRef("defaultStack") })
public class ManterDespesaAction extends ActionSupport {

    private Despesa despesa;
    private Date dataInicioVencimento;
    private Date dataFimVencimento;
    private Date dataInicioPagamento;
    private Date dataFimPagamento;

    private List<Despesa> resultadoConsulta;
    private FinanceiroServico financeiroServico = FinanceiroDelegate.getInstance();

    private static final String NOME_ENTIDADE_SINGULAR = "Despesa";

    private static final String NOME_ENTIDADE_PLURAL = "Despesas";

    @Action(value = "abrirConsultar", results = {
    	@Result(name = SUCCESS, location = LocalConstantes.LOCAL_JSP_FINANCEIRO_DESPESA + "/consultar.jsp"),
    	@Result(name = INPUT, location = LocalConstantes.LOCAL_JSP_FINANCEIRO_DESPESA + "/consultar.jsp")
    })
    public String abrirConsultar() throws Exception {
        return SUCCESS;
    }

    @Action(value = "consultar", results = {
    	@Result(name = SUCCESS, location = LocalConstantes.LOCAL_JSP_FINANCEIRO_DESPESA + "/listar.jsp"),
    	@Result(name = INPUT, params = {"actionName", "abrirConsultar"}, type = "redirectAction") 
    })
    public String consultar() throws Exception {	
    	setResultadoConsulta(financeiroServico.consultarDepesas(getDespesa().getNome(), getDespesa().getDescricao(),
    			getDataInicioPagamento(), getDataFimPagamento(), getDataInicioVencimento(), getDataFimVencimento()));

		if (getResultadoConsulta() == null || getResultadoConsulta().isEmpty()) {
			addActionError(getText("geral.mensagem.consulta.sem.retorno"));
			return INPUT;
		}
        return SUCCESS;
    }

    @Action(value = "abrirIncluir", results = {
    	@Result(name = SUCCESS, location = LocalConstantes.LOCAL_JSP_FINANCEIRO_DESPESA + "/incluir.jsp") })
    public String abrirIncluir() throws Exception {
        return SUCCESS;
    }

    @Action(value = "confirmarInclusao", results = {
    	@Result(name = SUCCESS, location = LocalConstantes.LOCAL_JSP_FINANCEIRO_DESPESA + "/confirmarInclusao.jsp") })
    public String confirmarInclusao() throws Exception {
        return SUCCESS;
    }

    @Action(value = "incluir", results = { 
    	@Result(name = SUCCESS, params = { "actionName", "abrirConsultar" }, type = "redirectAction")
    })
    public String incluir() throws Exception {
        addActionMessage(getText("geral.mensagem.incluir", new String[] { NOME_ENTIDADE_SINGULAR }));
        financeiroServico.salvar(despesa);
        return SUCCESS;
    }

    @Action(value = "abrirAlterar", results = { 
    	@Result(name = SUCCESS, location = LocalConstantes.LOCAL_JSP_FINANCEIRO_DESPESA+ "/alterar.jsp"),
    	@Result(name = INPUT, params = {"actionName", "consultar"}, type = "redirectAction") })
    public String abrirAlterar() throws Exception {
    	Despesa despesaBD = financeiroServico.getDespesa(despesa.getId());
		if (despesaBD == null) {
			addActionError(getText("geral.mensagem.get", new String[]{NOME_ENTIDADE_SINGULAR}));
			return INPUT;
		}
		setDespesa(despesaBD);
        return SUCCESS;
    }

    @Action(value = "confirmarAlteracao", results = {
    	@Result(name = SUCCESS, location = LocalConstantes.LOCAL_JSP_FINANCEIRO_DESPESA + "/confirmarAlteracao.jsp") })
    public String confirmarAlteracao() throws Exception {
        return SUCCESS;
    }

    @Action(value = "alterar", results = {
    	@Result(name = SUCCESS, params = { "actionName", "consultar" }, type = "redirectAction") 
    })
    public String alterar() throws Exception {
        addActionMessage(getText("geral.mensagem.alterar", new String[] { NOME_ENTIDADE_SINGULAR }));
        financeiroServico.alterar(despesa);
        return SUCCESS;
    }

    @Action(value = "confirmarExclusao", results = {
    	@Result(name = SUCCESS, location = LocalConstantes.LOCAL_JSP_FINANCEIRO_DESPESA + "/confirmarExclusao.jsp") })
    public String confirmarExclusao() throws Exception {
        return SUCCESS;
    }

    @Action(value = "excluir", results = {
    	@Result(name = SUCCESS, params = { "actionName", "consultar" }, type = "redirectAction") })
    public String excluir() throws Exception {
        addActionMessage(getText("geral.mensagem.excluir", new String[] { NOME_ENTIDADE_SINGULAR }));
        //financeiroServico.
        //TODO falta
        return SUCCESS;
    }

    @Action(value = "detalhar", results = { 
    	@Result(name = SUCCESS, location = LocalConstantes.LOCAL_JSP_FINANCEIRO_DESPESA + "/detalhar.jsp") })
    public String detalhar() throws Exception {
    	financeiroServico.getDespesa(despesa.getId());
        return SUCCESS;
    }

    public String getNomeEntidadeSingular() {
        return NOME_ENTIDADE_SINGULAR;
    }

    public String getNomeEntidadePlural() {
        return NOME_ENTIDADE_PLURAL;
    }

    public Despesa getDespesa() {
        return despesa;
    }

    public void setDespesa(Despesa despesa) {
        this.despesa = despesa;
    }

	public List<Despesa> getResultadoConsulta() {
		return resultadoConsulta;
	}

	public void setResultadoConsulta(List<Despesa> resultadoConsulta) {
		this.resultadoConsulta = resultadoConsulta;
	}

	public Date getDataInicioVencimento() {
		return dataInicioVencimento;
	}

	public void setDataInicioVencimento(Date dataInicioVencimento) {
		this.dataInicioVencimento = dataInicioVencimento;
	}

	public Date getDataFimVencimento() {
		return dataFimVencimento;
	}

	public void setDataFimVencimento(Date dataFimVencimento) {
		this.dataFimVencimento = dataFimVencimento;
	}

	public Date getDataInicioPagamento() {
		return dataInicioPagamento;
	}

	public void setDataInicioPagamento(Date dataInicioPagamento) {
		this.dataInicioPagamento = dataInicioPagamento;
	}

	public Date getDataFimPagamento() {
		return dataFimPagamento;
	}

	public void setDataFimPagamento(Date dataFimPagamento) {
		this.dataFimPagamento = dataFimPagamento;
	}
	
	
}

